home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / kowin / font / tcwin24s.lzh / tc_win.c < prev    next >
C/C++ Source or Header  |  1993-04-05  |  9KB  |  382 lines

  1. /*/ ******************************************************************* /*/
  2. /*/                                    /*/
  3. /*/       TC_WIN.win    version 1.00    小笠原博之 SPS0783 COR.    /*/
  4. /*/                                    /*/
  5. /*/    v1.10 1991 03/11 : Ko-Window 2.10 の UserSheet 対応        /*/
  6. /*/    v1.20 1992 01/15 : 漢字対応                    /*/
  7. /*/                                    /*/
  8. /*/ ******************************************************************* /*/
  9.  
  10. #include    <stdio.h>
  11. #include    <wlib.h>
  12. #include    <parts.h>
  13. #include    <winop.h>
  14.  
  15. /*#include    "mpat.h"*/
  16.  
  17. #define        in(a,b,c,d)    (info->x>=(a) && info->x<(c) && info->y>=(b) && info->y<(d))
  18.  
  19. #include    "tc_win.h"
  20.  
  21.  
  22. /*/
  23. /*    イベント定義
  24. /*/
  25. #define        UskEVENT1    (EventOpenON        \
  26.                 |EventRedrawON        \
  27.                 |EventCloseON        \
  28.                 |EventResizeON        \
  29.                 |EventUserON        \
  30.                 |EventKeyON        \
  31.                 |EventMouseSwitchON)
  32.  
  33. #define        UskEVENT2    (EventOpenON        \
  34.                 |EventRedrawON        \
  35.                 |EventCloseON        \
  36.                 |EventUserON        \
  37.                 |EventKeyON        \
  38.                 |EventMouseSwitchON)
  39.  
  40. int    UskWindowExec1();
  41. int    UskWindowExec2();
  42.  
  43. /* 24*24 = 3byte * 24 = 72byte */
  44. /*int    WindowHeapSize= ((MAXCHAR*32)/1024+5)*1024;*/
  45. int    WindowHeapSize= ((MAXCHAR*72)/1024+5)*1024;
  46.  
  47. #define        TCBUFSIZE    ((MAXCHAR*72)/1024+1)*1024;
  48. #define        TCBUFSIZE2    ((MAXCHAR2*72)/1024+1)*1024;
  49. #define        UMES        32
  50.  
  51. #define        mKAIJO        0
  52. #define        mSAKUJO        1
  53. #define        mKOUKAN        2
  54. #define        mFUKUSHA    3
  55. #define        mGOUSEI        4
  56.  
  57. short        Gmode= FALSE;
  58. int        TcBufSize= TCBUFSIZE;
  59. int        MaxChar= MAXCHAR;
  60.  
  61. char        *tcfont;        /* TC FONT BUFFER */
  62. Sheet        tcbuf= {        /* TC FONT Sheet DATA */
  63.             /*256,            /* .h */
  64.             24*16,
  65.             /*112*16,            /* .v */
  66.             112*24,
  67.             /*16            /* .hword */
  68.             24*16/16
  69.         };
  70.  
  71. char        fname[80];        /* file name */
  72. int        mode= mKAIJO;        /* exec mode */
  73. int        xxflag= FALSE;        /* カーソル ON/OFF */
  74. int        xx,            /* カーソル位置 */
  75.         yy;            /* カーソル位置 */
  76. int        editflag= FALSE;    /* 編集スイッチ */
  77. DrawBuf        OYA_dbuf[14];        /* 親ウィンドウ表示バッファ */
  78.  
  79. char        redrawmsg[90];
  80.  
  81. void
  82. WindowMain( argc, argv )
  83. char    **argv;
  84. {
  85.     WindowID    wp;
  86.     int        x= 2,
  87.             y= 2,
  88.             h= 24*16+14,
  89.             v= 200;
  90.  
  91.     /*/
  92.     /*    オプション解析
  93.     /*/
  94.     *fname= '\0';
  95.     *redrawmsg= '\0';
  96.     argc= AnalyzeArgs( argc, argv, &x, &y, &h, &v );
  97.     while( --argc ){
  98.         if( **++argv == '-' ){
  99.             ;
  100.         }else{
  101.             strcpy( fname, *argv );
  102.             setfname( fname );
  103.         }
  104.     }
  105.  
  106.     if( Gmode ){
  107.         TcBufSize= TCBUFSIZE2;
  108.         MaxChar= MAXCHAR2;
  109.         tcbuf.v= (MAXCHAR2/16+1)*24;
  110.     }
  111.  
  112.     tcfont= (char*)malloc( TcBufSize );
  113.     if( tcfont == NULL ){
  114.         ErrorMessage( "メモリが確保できません(HEAPを拡張して下さい)",ERROR_OK );
  115.         WindowSendSignal( WindowProcessID, SignalKill, NULL );
  116.         return;
  117.     }
  118.     memset( tcfont, 255, TcBufSize );
  119.     tcbuf.buf1=
  120.     tcbuf.buf2= (short*)tcfont;
  121.  
  122.     /* 親ウィンドウ */
  123.     wp = WindowTitleOpen( x, y, h, v+UMES, NULL, "TC font-24\0 Copyright 1991-93 H.Ogasawara COR.", Close|Push|Resize, UskWindowExec1 );
  124.     WindowSetEventAttr( wp, UskEVENT1 );
  125.  
  126.     /* 子ウィンドウ */
  127.     WindowSetEventAttr( WindowScrollOpen( 0, UMES, h, v, wp, 24*16, (MaxChar+15)/16*24, DirectionX|DirectionY, 16, 24, UskWindowExec2 ), UskEVENT2 );
  128. }
  129.  
  130. /*************************************\
  131.     親ウィンドウ処理
  132. \*************************************/
  133. UskWindowExec1( wp, info )
  134. WindowID    wp;
  135. EventInfo    *info;
  136. {
  137.     WindowID    cwp= WindowGetChildTop( wp );
  138.     char        *err= 0;
  139.     static short    nored= 0;
  140.     switch( info->option ){
  141.         case EventOpen:
  142.             DrawSetClear( OYA_dbuf, 1 );
  143.             DrawSetSymbol( OYA_dbuf+1, 4, 1, "名前 書込 選択    解除 消去 交換 複写 合成", 9, 12 );
  144.             DrawSetLine( OYA_dbuf+2, 2, 1, 6*4+4, 13, ShadowUp, OptionShadow );
  145.             DrawSetLine( OYA_dbuf+3, 6*5-2+4, 1, 6*8+12, 13, ShadowUp, OptionShadow );
  146.             DrawSetLine( OYA_dbuf+4, 6*10-2+4, 1, 6*13+12, 13, ShadowUp, OptionShadow );
  147.             DrawSetLine( OYA_dbuf+5, 2, 1+16, 260, 14+16, ShadowDown, OptionShadow );
  148.             strcpy( redrawmsg, fname );
  149.             if( *fname ){
  150.                 nored= 1;
  151.                 WindowRedraw( wp );
  152.                 err= (char*)Tc_load( wp, fname );
  153.                 nored= 0;
  154.             }
  155.             WindowRedraw( wp );
  156.             if( err )
  157.                 UskMes( err, wp );
  158.             return    TRUE;
  159.  
  160.         case EventRedraw:
  161.         if( nored ){
  162.             DrawBuf    dbuf[1];
  163.             DrawSetClear( dbuf, 1 );
  164.             WindowDraw( wp, dbuf, 1 );
  165.         }else{
  166.             int    i;
  167.  
  168.             DrawSetSymbol( OYA_dbuf+6, 5, 2+16, redrawmsg, 9, 12 );
  169.             for( i=0 ; i<5 ; i++ )
  170.                 DrawSetLine( OYA_dbuf+7+i, i*30+112-2, 1, i*30+110+28, 13, mode==i ? ShadowDown : ShadowUp, OptionShadow );
  171.             WindowDraw( wp, OYA_dbuf, 7+5 );
  172.             WindowSendEvent( cwp, info );
  173.         }
  174.             return    TRUE;
  175.  
  176.         case EventClose:
  177.             if( editflag ){
  178.                 if( OK( "TC_WIN:データをセーブしますか?", fname ) ){
  179.                     if( *fname == '\0' ){
  180.                         extern int    defchar;
  181.                         strcpy( fname, "TC$(^_^).fon" );
  182.                         defchar= MaxChar;
  183.                     }
  184.                     Tc_save( wp, fname );
  185.                 }
  186.             }
  187.             WindowClose( wp );
  188.             WindowConnectionClose();
  189.             return    TRUE;
  190.  
  191.         case EventResize:
  192.             WindowResize( cwp, 0, UMES, info->h, info->v-16-16 );
  193.             WindowResize( wp, info->x, info->y, info->h, info->v );
  194.             break;
  195.  
  196.         case EventUser:    {
  197.             switch( info->ComData ){
  198.                 case UserStrings:
  199.                     (char*)(info->ComBuffer)= *(char**)(info->ComBuffer);
  200.                 case UserPaste:
  201.                 case UserString:
  202.                     strcpy( fname, (char*)(info->ComBuffer) );
  203.                     setfname( fname );
  204.                     if( editflag ){
  205.                         if( !OK( "セーブしていません。このまま読み込むと", "内容が書き換わります。よろしいですか?" ) ){
  206.                             UskMes( "キャンセルしました", wp );
  207.                             return    TRUE;
  208.                         }    /**/
  209.                     }
  210.                     UskMes( "読み込み中", wp );
  211.                     err= (char*)Tc_load( wp, fname );
  212.                     WindowRedraw( wp );
  213.                     if( err )
  214.                         UskMes( err, wp );
  215.                     editflag= FALSE;
  216.                     break;
  217.                 case UserSheet:
  218.                 case 256:
  219. /*                default:    */
  220.                     User_font( wp, info );
  221.             }
  222.             return    TRUE;
  223.         }
  224.  
  225.         case EventMouseSwitch:
  226.             if( info->y >= 32 ){
  227.                 info->y -= 32;
  228.                 WindowSendEvent( cwp, info );
  229.             }else if( info->LeftON && info->y < 16 ){
  230.                 if( in( 2, 1, 6*4+4, 13 ) ){
  231.                     Tc_rename( wp, fname );
  232.                 }else if( in( 6*5-2+4, 1, 6*8+12, 13 ) ){
  233.                     Tc_save( wp, fname );
  234.                 }else if( in( 6*10-2+4, 1, 6*13+12, 13) ){
  235.                     tcmenu( wp, info );
  236.                 }else if( info->x > 112-2 && info->x < 112-2+30*5 ){
  237.                     DrawBuf    dbuf[6];
  238.                     int    i;
  239.                     mode= (info->x - 112) / 30;
  240.         modechg:
  241.                     for( i=0 ; i<5 ; i++ )
  242.                         DrawSetLine( dbuf+i, i*30+112-2, 1, i*30+110+28, 13, mode==i ? ShadowDown : ShadowUp, OptionShadow );
  243.                     WindowDraw( wp, dbuf, 5 );
  244.                     if( mode < 2 && xxflag )
  245.                         curon( cwp, FALSE );
  246.                 }
  247.             }else if( info->RightON && in( 6*5-2+4, 1, 6*8+12, 13 ) ){
  248.                 Tc_save( wp, fname );
  249.             }else if( info->LeftON && info->y > 16 && info->y < 32 ){
  250.                 SendData( wp, info, UserString, redrawmsg );
  251.             }else
  252.                 return    FALSE;
  253.             return    TRUE;
  254.  
  255.         case EventKey:
  256.             switch( info->KeyCode ){
  257.             case FuncKey+6:
  258.             case FuncKey+7:
  259.             case FuncKey+8:
  260.             case FuncKey+9:
  261.             case FuncKey+10:
  262.                 mode= info->KeyCode - (FuncKey+6);
  263.                 goto    modechg;
  264.             case 'N'&31:
  265.                 Tc_rename( wp, fname );
  266.                 break;
  267.             case 'S'&31:
  268.                 Tc_save( wp, fname );
  269.                 break;
  270.             default:
  271.                 info->y -= 32;
  272.                 WindowSendEvent( cwp, info );
  273.             }
  274.             return    TRUE;
  275.     }
  276.     return    FALSE;
  277. }
  278.  
  279. /*************************************\
  280.     スクロールウィンドウ処理
  281. \*************************************/
  282. UskWindowExec2( wp, info )
  283. WindowID    wp;
  284. EventInfo    *info;
  285. {
  286.     DrawBuf    dbuf[3];
  287.     switch( info->option ){
  288.         case EventOpen:
  289.             WindowRedraw( wp );
  290.             return    TRUE;
  291.  
  292.         case EventRedraw:
  293.             DrawSetPut( dbuf, 0, 0, &tcbuf );
  294.             if( xxflag ){
  295.                 DrawSetLine( dbuf+1,xx,yy,xx+23,yy+23,3|OptionXor, OptionFill );
  296.                 WindowDraw( wp, dbuf, 2 );
  297.             }else
  298.                 WindowDraw( wp, dbuf, 1 );
  299.             return    TRUE;
  300.  
  301.         case EventMouseSwitch:    {
  302.             DrawBuf    dbuf[6];
  303.             int    x= info->x / 24;
  304.             int    y= info->y / 24;
  305.             if( info->LeftON ){
  306.                 if( mode == 0 ){
  307.                     send_User_font( wp, info );
  308.                 }else if( mode == 1 ){
  309.                     /* 消去 */
  310.                     del1char( wp, x, y );
  311.                 }else if( mode >= 2 && x < 16 ){
  312.                     if( xxflag ){
  313.                         unsigned short    font1[48];
  314.                         unsigned short    font2[48];
  315.                         int        i;
  316.                         editflag= TRUE;
  317.                         if( !(info->ShiftStat & 4) )
  318.                             curon( wp, FALSE );
  319.                         get1char( xx/24, yy/24, font1 );
  320.                         get1char( x, y, font2 );
  321.                         switch( mode ){
  322.                             case 2: /* 交換 */
  323.                                 put1char( wp, x, y, font1 );
  324.                                 put1char(wp,xx/24,yy/24,font2);
  325.                                 break;
  326.                             case 4: /* 合成 */
  327.                                 for( i=0 ; i<24 ; i++ )
  328.                                     font1[i]&=font2[i];
  329.                             case 3: /* 複写 */
  330.                                 put1char( wp, x, y, font1 );
  331.                                 break;
  332.                         }
  333.                     }else{
  334.                         xx= x*24;
  335.                         yy= y*24;
  336.                         curon( wp, TRUE );
  337.                     }
  338.                 }
  339.             }else if( info->RightON ){
  340.                 if( xxflag )
  341.                     curon( wp, FALSE );
  342.                 else
  343.                     fontcode( wp, info );
  344.             }
  345.             return    TRUE;
  346.         }
  347.  
  348.         case EventKey:
  349.             if( info->KeyCode == ' ' )
  350.                 fontcode( wp, info );
  351.             return    TRUE;
  352.     }
  353.     return    FALSE;
  354. }
  355.  
  356.  
  357. /*************************************\
  358.     メッセージ表示
  359. \*************************************/
  360. UskMes( str, wp )
  361. char        *str;
  362. WindowID    wp;
  363. {
  364.     DrawBuf    buf[2];
  365.     DrawSetSymbol( buf, 5, 2+16, "                              ", 9, 12 );
  366.     DrawSetSymbol( buf+1, 5, 2+16, str, 9, 12 );
  367.     strcpy( redrawmsg, str );
  368.     WindowDraw( wp, buf, 2 );
  369. }
  370.  
  371.  
  372. curon( wp, a )
  373. WindowID    wp;
  374. int        a;
  375. {
  376.     DrawBuf    dbuf[1];
  377.     xxflag= a;
  378.     DrawSetLine( dbuf, xx, yy, xx+23, yy+23, 3|OptionXor, OptionFill );
  379.     WindowDraw( wp, dbuf, 1 );
  380. }
  381.  
  382.